10189. Разгребатель мин
Рассмотрим игру “разгребатель
мин” (minesweeper). Имеется поле, на котором мины обозначены символом ‘*’.
Необходимо для каждого пустого поля определить количество соседних полей,
содержащих мины.
Вход. Первая
строка каждого теста содержит размер поля: количество строк n и столбцов m (0 < n, m
£ 100). Следующие n строк описывают состояние поля. Пустая
клетка поля обозначается символом ‘.’, клетка с миной – символом ‘*’.
Выход. Для
каждого теста вывести входное поле, в
каждой пустой (не занятой миной) ячейке которого находится количество мин в
соседних с ней клетках.
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
Пример выхода
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
обработка массива
Заведем массив res, для которого
res[i][j] будет содержать количество соседних мин для позиции (i, j).
После прочтения данных, для каждой клетки (i,
j) с миной прибавим единицу к каждой
соседней c (i, j) клетке в массиве res. Выводим поле, печатая для каждой мины
символ ‘*’, а для каждого пустого поля значение res[i][j].
В массиве matr длины MAX = 102
будем содержать входное поле, массив res будем использовать для подсчета
соседних мин.
#define MAX 102
char matr[MAX][MAX],
res[MAX][MAX];
Вводим размеры поля m и n.
scanf("%d %d\n",&m,&n);
while(1)
{
Выводим номер теста count. Читаем входное поле в массив
matr.
printf("Field
#%d:\n",++count);
memset(res,0,sizeof(res));
for(i = 1; i <=
m; i++) gets(&matr[i][1]);
Проходим по всем клеткам поля.
Для каждой мины прибавим единицу ко всем соседним с ней клеткам в массиве res.
for(i = 1;
i <= m; i++)
for(j = 1; j <= n; j++)
if (matr[i][j] == '*')
{
res[i+1][j]++; res[i-1][j]++; res[i][j+1]++;
res[i][j-1]++;
res[i+1][j+1]++; res[i-1][j+1]++;
res[i-1][j-1]++; res[i+1][j-1]++;
}
Выводим результат. Для каждой
мины выводим символ ‘*’, а для каждого пустого поля значение res[i][j].
for(i = 1; i
<= m; i++)
{
for(j = 1;
j <= n; j++)
if
(matr[i][j] == '*') printf("*"); else
printf("%d",res[i][j]);
printf("\n");
}
После вывода результата на
последний тест не следует выводить пустую строку. Поэтому воспользуемся
приведенным ниже кодом.
scanf("%d
%d\n",&m,&n);
if (!m
&& !n) break; else
printf("\n");
}